const dateTimeFormat = {}
dateTimeFormat.ALL = 'yyyy-MM-dd hh:mm:ss.SSS'
dateTimeFormat.Y_M_D_H_SM_S = 'yyyy-MM-dd hh:mm:ss'
dateTimeFormat.Y_M_D_H_SM_E = 'yyyy-MM-dd hh:mm(E)'
dateTimeFormat.Y_M_D_H_SM = 'yyyy-MM-dd hh:mm'
dateTimeFormat.Y_M_D = 'yyyy-MM-dd'
dateTimeFormat.Y_M = 'yyyy-MM'
dateTimeFormat.H_SM = 'hh:mm'
dateTimeFormat.H = 'hh'
dateTimeFormat.SM = 'mm'
dateTimeFormat.NO_BREAK_ALL = 'yyyyMMddhhmmssSSS'
dateTimeFormat.NO_BREAK_Y_M_D_H_SM_S = 'yyyyMMddhhmmss'
dateTimeFormat.NO_BREAK_Y_M_D_H_SM = 'yyyyMMddhhmm'
dateTimeFormat.NO_BREAK_Y_M_D = 'yyyyMMdd'
dateTimeFormat.NO_BREAK_Y_M = 'yyyyMM'
dateTimeFormat.CN_Y_M_D_H_SM = 'yyyy年MM月dd日 hh时mm分'
dateTimeFormat.CN_Y_M_D = 'yyyy年MM月dd日'
dateTimeFormat.CN_Y_M = 'yyyy年MM月'

function formatDate(tempDate, fmt) {
  const o = {
    'M+': tempDate.getMonth() + 1, // 月份
    'd+': tempDate.getDate(), // 日
    'h+': tempDate.getHours(), // 小时
    'm+': tempDate.getMinutes(), // 分
    's+': tempDate.getSeconds(), // 秒
    'q+': Math.floor((tempDate.getMonth() + 3) / 3), // 季度
    'S': tempDate.getMilliseconds() // 毫秒
  }
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (tempDate.getFullYear() + '').substr(4 - RegExp.$1.length))
  }
  for (const k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
    }
  }
  return fmt
}

function dateFormat(date, formate = 'yyyy-MM-dd hh:mm:ss') {
  // eslint-disable-next-line no-extend-native
  Date.prototype['format'] = function(fmt) {
    const o = {
      'M+': this.getMonth() + 1, // 月份
      'd+': this.getDate(), // 日
      'h+': this.getHours(), // 小时
      'm+': this.getMinutes(), // 分
      's+': this.getSeconds(), // 秒
      'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
      'S': this.getMilliseconds() // 毫秒
    }
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
    }
    for (const k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
      }
    }
    return fmt
  }
  return new Date(date)['format'](formate)
}

/**
 * @param {string} time
 * @param {object} option
 * @returns {string}
 */
function formatDateString(time, option) {
  if (undefined === time || time + '' === '0') {
    return ''
  }
  time += ''
  let date
  if (undefined === option) {
    if (time.length === 6) {
      // 示例：202101 -> 2021-01
      date = insertStr(time, 4, '-')
    } else if (time.length === 8) {
      // 示例：20210101 -> 2021-01-01
      const date1 = insertStr(time, 4, '-')
      date = insertStr(date1, 7, '-')
    } else {
      date = time
    }
  } else {
    if (time.length === 8) {
      // 示例：16121088 -> 1612108800000 -> 2020-01-01
      date = new Date(parseInt(time + '00000'))
    } else if (time.length === 13) {
      // 示例：1612108800000 -> 2020-01-01 01:01:01
      date = new Date(parseInt(time))
    } else {
      date = time
      return date
    }
    // 格式化日期
    if (undefined === option.format) {
      option.format = dateTimeFormat.Y_M_D_H_SM
    }
    date = formatDate(date, option.format)
  }
  return date
}

/**
 * @param {string} value
 * @returns {string}
 */
function formatPercentageAmount(value) {
  let data
  if (parseInt(value) === 0) {
    data = parseInt(value)
  } else {
    data = parseInt(value) / 100
  }
  return data
}

function insertStr(soure, start, newStr) {
  return soure.slice(0, start) + newStr + soure.slice(start)
}

const pickerOptions = () => {
  return {
    shortcuts: [{
      text: '今天',
      onClick(picker) {
        const end = new Date()
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        start.setHours(0, 0, 0, 0)
        picker.$emit('pick', [start, end])
      }
    }, {
      text: '昨天',
      onClick(picker) {
        const end = new Date()
        end.setTime(end.getTime() - 3600 * 1000 * 24)
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        start.setHours(0, 0, 0, 0)
        start.setTime(start.getTime() - 3600 * 1000 * 24)
        picker.$emit('pick', [start, end])
      }
    }, {
      text: '近七天',
      onClick(picker) {
        const end = new Date()
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
        start.setHours(0, 0, 0, 0)
        picker.$emit('pick', [start, end])
      }
    }, {
      text: '近三十天',
      onClick(picker) {
        const end = new Date()
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
        start.setHours(0, 0, 0, 0)
        picker.$emit('pick', [start, end])
      }
    }, {
      text: '本月',
      onClick(picker) {
        const end = new Date()
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        start.setDate(1)
        start.setHours(0, 0, 0, 0)
        picker.$emit('pick', [start, end])
      }
    }, {
      text: '上月',
      onClick(picker) {
        // 上个月的第一天
        const start = new Date()
        start.setMonth(start.getMonth() - 1)
        start.setDate(1)
        start.setHours(0, 0, 0, 0)

        const end = new Date()
        // 设置日期为上个月的最后一天
        end.setDate(0) // 将日期设置为0，会自动回滚到上个月的最后一天
        end.setHours(23, 59, 59, 999)

        picker.$emit('pick', [start, end])
      }
    }, {
      text: '今年',
      onClick(picker) {
        const end = new Date()
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        // 设置月份为1（即1月），日期为1
        start.setMonth(0) // JavaScript中的月份是从0开始的，0代表1月
        start.setDate(1)
        start.setHours(0, 0, 0, 0)

        picker.$emit('pick', [start, end])
      }
    }, {
      text: '去年',
      onClick(picker) {
        let end = new Date()
        // 获取去年的年份
        const lastYear = end.getFullYear() - 1
        // 设置年份为去年，月份为12月（注意JavaScript中月份是从0开始的，所以12月是11），日期为31日
        end = new Date(lastYear, 11, 31)
        end.setHours(23, 59, 59, 999)

        const start = new Date()
        // 获取去年的年份
        const startLastYear = start.getFullYear() - 1
        // 设置年份为去年，月份和日期保持不变（默认为当前月份和日期）
        start.setFullYear(startLastYear)
        start.setMonth(0) // JavaScript中的月份是从0开始的，0代表1月
        start.setDate(1)
        start.setHours(0, 0, 0, 0)

        picker.$emit('pick', [start, end])
      }
    }]
  }
}

module.exports = {
  dateTimeFormat,
  dateFormat,
  formatDate,
  formatDateString,
  formatPercentageAmount,
  pickerOptions
}
